#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define LEN 10
#define ROW_MAX 1024

void tail(FILE * src, FILE * dst, unsigned n)
{
    char (*list)[1024] = (char (*)[1024])calloc(n, 1024 * sizeof(char));
    int ch;

    int ind =0, row =0;

    //读取数据的最后一行都会多一个换行,不太清楚
    while ((ch = fgetc(src)) != EOF) {
        list[row][ind++] = ch;

        if (ch == '\n') {   //遇到\n,结束当前行 开始下一行
            list[row][ind] = '\0';

            row = ++row % n;
            ind = 0;
        }
    }

    //用vi编辑末尾会多一个行结束符 但有些文件又没有
    //结束当前行并转到下一行(即要输出的第一行)
    if (ind != 0)
        list[row++][ind] = 0;

    int i=n;
    while (i--)
        fputs(list[row++ % n], dst);

    free(list);
}

int main(int argc, char *argv[])
{
    FILE * fp;
    unsigned len = LEN;

    if (argc < 2) {
        tail(stdin, stdout, len);
        return 0;
    }

    while (--argc > 0) {
        if (**++argv == '-')
            if (*++*argv == 'n')
                len = atoi(++*argv);
            else {
                fputs("参数错误!\n", stderr);
                return 1;
            }

        else {
            if ((fp = fopen(*argv, "r")) != NULL) {
                tail(fp, stdout, len);
                fclose(fp);

            } else {
                fprintf(stderr, "文件%s不存在!\n", *argv);
                return 1;
            }
        }
    }
    return 0;
}
